"use strict";
// import { Application } from "egg";

const errorHandle = errorArray => {
  return errorArray.map(item => {
    if (item.code === "invalid") {
      if (/empty/.test(item.message)) {
        item.code = "empty";
      } else if (/should be an/.test(item.message)) {
        item.code = "type";
        item.message = item.message.replace("should be an ", "");
      }
    }
    return item;
  });
};

// 错误编码
// 501,'当前账号无权限'
// 502,'该操作需要ID'
// '503', '账号或密码为空','请输入正确的账号','账号或密码错误','当前账号已注册'
// '504', '已存在该名称'
export default () => {
  return async (ctx, next) => {
    try {
      await next();
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      console.log(err);
      console.log("=================");
      if (err.status && err.status < 500) {
        // tslint:disable-next-line:no-invalid-this
        ctx.app.emit("error", err);
      } else {
        ctx.logger.error({
          code: err.status,
          message: err
        });
      }

      const status = err.status || 500;
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      const _error =
        status >= 500 && ctx.app.config.env === "prod"
          ? "Internal Server Error"
          : err.message;
      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = {
        code: err.code || status, // 服务端自身的处理逻辑错误(包含框架错误500 及 自定义业务逻辑错误533开始 ) 客户端请求参数导致的错误(4xx开始)，设置不同的状态码
        message: _error,
        data: null
      };
      if (status === 422) {
        ctx.body.code = 422;
        ctx.body.errorData = errorHandle(err.errors);
        delete ctx.body.message;
      }
      ctx.status = 200;
    }
  };
};
